package com.yaolonga.itfc.manager.core;


import com.yaolonga.itfc.manager.core.wifi.WifiLinkConf;
import com.yaolonga.itfc.manager.core.wifi.WifiLinkInfo;
import com.yaolonga.itfc.manager.core.wifi.WifiScanInfo;
import lombok.NonNull;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author: yaolong
 * @CreateTime: 2024-10-17  10:00
 * @Description: 网络接口管理者
 * @Version: 1.0
 */
public interface NetworkInterfaceManager {

    default Boolean isSupportVersion(String version){
        return getSystemType().isSupportVersion(version);
    }

    /**
     * 获取平台类型
     */
    PlatformType getPlatformType();

    /**
     * @return 获取系统类型
     */
    SystemType getSystemType();

    /**
     * @return 获取网卡信息
     */
    List<NetworkInterfaceInfo> getNetworkInterfaceInfos();


    /**
     * 获取网卡信息
     *
     * @param interfaceName 网卡名称
     * @return 网卡信息
     */
    NetworkInterfaceInfo getNetworkInterfaceInfo(String interfaceName);


    /**
     * 配置dhcp ip地址
     *
     * @param interfaceName 网卡名称
     * @return 结果
     */
    String configDhcpIpAddress(String interfaceName);

    /**
     * 配置dhcp dns地址 (自动)
     *
     * @param interfaceName 网卡名称
     * @return 结果
     */
    String configDhcpDnsAddress(String interfaceName);

    /**
     * 配置静态ip地址
     *
     * @param interfaceName 网卡名称
     * @return 结果
     */
    String configStaticIpAddress(@NonNull String interfaceName, @NonNull String ip, @NonNull String mask, @NonNull String gateway);

    /**
     * 配置静态dns地址 (首选静态)
     *
     * @param interfaceName 网卡名称
     * @param dnsAddress    dns地址
     * @return 结果
     */
    String configStaticDnsAddress(String interfaceName, String dnsAddress);


    /**
     * 添加一个dns地址 （追加一个dns）
     *
     * @param interfaceName 网卡名称
     * @param dnsAddress    dns地址
     * @param index         添加索引
     * @return 结果
     */
    String addDnsAddress(String interfaceName, String dnsAddress, int index);

    /**
     * 添加一个dns地址 （追加一个dns）
     *
     * @param interfaceName 网卡名称
     * @param dnsAddress    dns地址
     * @return 结果
     */
    String addDnsAddress(String interfaceName, String dnsAddress);

    /**
     * 添加多个dns地址 (添加顺序根据列表顺序)
     *
     * @param interfaceName 网卡名称
     * @param dnsAddress    dns地址
     * @return 结果
     */
    default Map<String, String> addDnsAddress(String interfaceName, List<String> dnsAddress) {
        if (dnsAddress == null || dnsAddress.isEmpty()) {
            return null;
        }
        Map<String, String> map = new HashMap<>();
        for (String address : dnsAddress) {
            String s = addDnsAddress(interfaceName, address);
            map.put(address, s);
        }
        return map;
    }

    /**
     * 删除dns地址
     *
     * @param interfaceName 网卡名称
     * @param dnsAddress    dnsAddress
     * @return 结果
     */
    String delDnsAddress(String interfaceName, String dnsAddress);


    /**
     * 添加路由
     *
     * @param route 路由配置
     * @return 结果
     */
    String addRoute(NetRoute route);

    /**
     * 添加临时路由
     *
     * @param route 路由配置
     * @return 结果
     */
    default String addTempRoute(NetRoute route) {
        route.setType(NetRouteType.TEMPORARY_ROUTE);
        return addRoute(route);
    }

    /**
     * 添加永久路由
     *
     * @param route 路由配置
     */
    default String addPermanentRoute(NetRoute route) {
        route.setType(NetRouteType.PERMANENT_ROUTE);
        return addRoute(route);
    }

    /**
     * 添加多个路由
     *
     * @param routes 路由配置列表
     */
    default Map<String, String> addRoutes(List<NetRoute> routes) {
        if (routes == null || routes.isEmpty()) {
            return null;
        }
        Map<String, String> map = new HashMap<>();
        for (NetRoute route : routes) {
            String res = addRoute(route);
            map.put(route.getTarget(), res);
        }
        return map;
    }


    /**
     * 修改路由
     *
     * @param route 路由配置
     * @return 结果
     */
    String changeRoute(NetRoute route);

    /**
     * 删除路由
     *
     * @param route 路由配置
     * @return 结果
     */
    String delRoute(NetRoute route);


    /**
     * 扫描wifi信息
     *
     * @param interfaceName 网卡名称
     * @return wifi信息
     */
    WifiScanInfo scanWifiInfo(String interfaceName);


    /**
     * 获取wifi连接信息
     *
     * @param interfaceName 网卡名称
     * @return wifi连接信息
     */
    default WifiLinkInfo getWifiLinkInfo(String interfaceName) {
        return getWifiLinkInfos().stream().filter(wifiLinkInfo -> wifiLinkInfo.getInterfaceName().equals(interfaceName)).findFirst().orElse(null);
    }

    /**
     * 获取wifi连接信息列表
     *
     * @return wifi连接信息列表
     */
    List<WifiLinkInfo> getWifiLinkInfos();


    /**
     * 连接wifi
     *
     * @param id  conf id
     * @param interfaceName  网卡名称
     * @param profileName           profileName
     * @param ssid           ssid
     * @param password       密码
     * @param securityType       安全类型 {@link com.yaolonga.itfc.manager.core.wifi.WifiSecureType}
     * @param autoConnection 是否自动连接
     * @return 结果
     */
    default String connectWifi(
            String id,
            String interfaceName,
            String profileName,
            String ssid,
            String password,
            String securityType,
            boolean autoConnection
    ){
        WifiLinkConf wifiLinkConf = new WifiLinkConf();
        wifiLinkConf.setInterfaceName(interfaceName);
        wifiLinkConf.setName(profileName);
        wifiLinkConf.setId(id);
        wifiLinkConf.setSsid(ssid);
        wifiLinkConf.setPassword(password);
        wifiLinkConf.setAutoConnection(autoConnection);
        wifiLinkConf.setSecureType(securityType);
        return connectWifi(wifiLinkConf);
    }

    /**
     * 连接wifi
     *
     * @param wifiLinkConf wifi连接配置
     * @return 结果
     */
     String connectWifi(WifiLinkConf wifiLinkConf);

    /**
     * 断开wifi
     *
     * @param interfaceName 网卡名称
     * @return 结果
     */
    String disconnectWifi(String interfaceName);


    /**
     * 忘记wifi
     *
     * @param interfaceName 网卡名称
     * @param profileName   profileName
     * @return 结果
     */
    String forgetWifi(String interfaceName,  String profileName);


    /**
     * 设置wifi配置
     *
     * @param wifiLinkConf wifi配置信息
     * @return 结果
     */
    String setWifiConf(WifiLinkConf wifiLinkConf);

    /**
     * 获取wifi配置
     *
     * @param interfaceName 网卡名称
     * @param profileName          profileName
     * @return 结果
     */
    WifiLinkConf getWifiConf(String interfaceName, String profileName);


    /**
     * 删除wifi配置
     *
     * @param interfaceName 网卡名称
     * @param profileName          profileName
     * @return 结果
     */
    String delWifiConf(String interfaceName, String profileName);


    /**
     * 启用wifi (win 需要 admin权限)
     *
     * @param interfaceName 网卡名称
     * @return 结果
     */
    String enableWifi(String interfaceName);

    /**
     * 禁用wifi (win 需要 admin权限)
     *
     * @param interfaceName 网卡名称
     * @return 结果
     */
    String disableWifi(String interfaceName);

}
